import pandas as pd
import matplotlib.pyplot as plt
import os
import warnings

# 忽略警告
warnings.simplefilter('ignore')

# 设置中文字体
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

# 创建输出目录
os.makedirs('figs', exist_ok=True)
os.makedirs('output', exist_ok=True)

# 读取数据
df = pd.read_excel('FhjlViewDD.xlsx')

# 预处理
df['创建时间'] = pd.to_datetime(df['创建时间'])
df['日期'] = df['创建时间'].dt.date
df = df[df['创建时间'].dt.month == 6]
df['运输量'] = df['到站吨位']
df.loc[df['运输量'] == 0, '运输量'] = df['净重']

# === 矿粉每日趋势图（复合图） ===
mine_daily = df[df['货品'].str.contains('矿粉', na=False)].groupby('日期')['运输量'].sum()
plt.figure(figsize=(12, 6))
mine_daily.plot(kind='bar', color='steelblue', label='柱状图')
mine_daily.plot(marker='o', color='orange', label='折线图')
plt.title('6月每日矿粉运输量')
plt.ylabel('吨')
plt.xlabel('日期')
plt.xticks(rotation=90)
plt.legend()
plt.tight_layout()
plt.savefig('figs/6月矿粉日趋势_复合图.png')
plt.clf()

# === 水泥每日趋势图（复合图） ===
cement_daily = df[df['货品'].str.contains('水泥', na=False)].groupby('日期')['运输量'].sum()
plt.figure(figsize=(12, 6))
cement_daily.plot(kind='bar', color='seagreen', label='柱状图')
cement_daily.plot(marker='o', color='orange', label='折线图')
plt.title('6月每日水泥运输量')
plt.ylabel('吨')
plt.xlabel('日期')
plt.xticks(rotation=90)
plt.legend()
plt.tight_layout()
plt.savefig('figs/6月水泥日趋势_复合图.png')
plt.clf()

# === 客户运输量（条形图） ===
client_demand = df.groupby('客户')['运输量'].sum().sort_values(ascending=False)
client_demand.to_csv('output/客户6月货运量.csv', encoding='utf-8-sig')
plt.figure(figsize=(10, 6))
plt.barh(client_demand.index, client_demand.values, color='dodgerblue')
plt.title('6月各客户货运总量', fontsize=14)
plt.xlabel('吨', fontsize=12)
plt.xticks(fontsize=10)
plt.yticks(fontsize=8)
plt.gca().invert_yaxis()
plt.tight_layout()
plt.savefig('figs/6月客户货运总量.png')
plt.clf()

# === 发货地饼图（自动合并小块） ===
origin_demand = df.groupby('发货地')['运输量'].sum().sort_values(ascending=False)
top_n = 8
if len(origin_demand) > top_n:
    others = origin_demand[top_n:].sum()
    origin_demand = origin_demand[:top_n]
    origin_demand['其他'] = others
plt.figure(figsize=(8, 8))
origin_demand.plot(kind='pie', autopct=lambda p: '{:.1f}%'.format(p) if p >= 5 else '', startangle=90)
plt.title('6月前发货地货运占比（仅显示主要类别）')
plt.ylabel('')
plt.tight_layout()
plt.savefig('figs/6月发货地货运占比_饼图.png')
plt.clf()

# === 发货地条形图 ===
plt.figure(figsize=(10, 6))
origin_demand.drop('其他', errors='ignore').plot(kind='bar', color='slateblue')
plt.title('6月前10发货地货运量')
plt.ylabel('吨')
plt.xticks(rotation=45, ha='right')
plt.tight_layout()
plt.savefig('figs/6月发货地货运量_条形图.png')
plt.clf()

# === 车牌号运输量（输出和可视化） ===
vehicle_demand = df.groupby('车辆')['运输量'].sum().sort_values(ascending=False)
vehicle_demand.to_csv('output/车牌号货运量.csv', encoding='utf-8-sig')
plt.figure(figsize=(12, 8))
vehicle_demand.head(30).plot(kind='bar', color='darkcyan')
plt.title('6月前30车牌号运输量')
plt.ylabel('吨')
plt.xticks(rotation=90)
plt.tight_layout()
plt.savefig('figs/6月车牌号运输量_前30.png')
plt.clf()
